# -*- coding: utf-8 -*-
"""
Created on Wed Feb 10 18:46:53 2021

@author: 江榕煜

@brief: 图片压缩工具
"""

'''辅助模块导入'''
import os
from PIL import Image
import glob
import math


'''
在你使用之前
请务必适配该部分
'''
DIR = r'./'; # 要进行压缩处理的图像路径，现在默认文件运行路径
saveDIR = r'./' # 压缩处理后图像存储路径
MaxSizeOfImg = 1e6; #限制压缩后最大图像大小，单位：Byte

condense_JPG = True;    # 若压缩 .jpg 后缀文件请使能该项。若不用，请设置为False
condense_PNG = True;    # 若压缩 .png 后缀文件请使能该项


'''图片文件匹配'''
fileList_JPG = glob.glob('%s%s%s' % (DIR, '*', '.jpg'));
fileList_PNG = glob.glob('%s%s%s' % (DIR, '*', '.png'));

fileList = [];

if condense_JPG:
    fileList += fileList_JPG;
if condense_PNG:
    fileList += fileList_PNG;

'''存储路径存在性检查'''
if not os.path.exists(saveDIR):
    os.mkdir(saveDIR);
    print("创建文件夹:"+saveDIR)

'''开始压缩处理'''
for imgFile in fileList:
    '''文件大小检查'''
    thisFileSize = os.path.getsize(imgFile)
    if thisFileSize < MaxSizeOfImg:   # 符合要求跳过不处理
        continue;
    else:
        
        '''用户提示'''
        print("----------")
        print("压缩图像"+str(imgFile)+"（大小："+str(thisFileSize)+"Bytes）")
        
        
        '''计算存储路径'''
        nameRout = imgFile.split('/')
        nameRout = nameRout[-1].split('\\')
        nameRout = nameRout[-1]
        saveDir = '%s%s' % (saveDIR,nameRout)
        
        
        '''先剥离图像原本的辅助数据'''
        thisImg = Image.open(imgFile) # 打开图像源文件
        cleanImg = thisImg.resize(thisImg.size)
        thisImg.close()
        cleanImg.save(saveDir)
        cleanImg.close()
        
        
        '''图像抽样压缩'''
        thisFileSize = os.path.getsize(saveDir)
        if thisFileSize < MaxSizeOfImg:
            continue;
        else:
            condenseCoe = math.sqrt( float(thisFileSize)/MaxSizeOfImg);  # 计算压缩比
            
            thisImg = Image.open(saveDir) # 打开源图像文件
            
            thisImgHeight = thisImg.height; # 获取图像像素个数
            thisImgWidth = thisImg.width;
            
            print("压缩比为："+str(condenseCoe))
            print("源图像分辨率：%d，%d" % (thisImgWidth,thisImgHeight))
            
            thisImgHeight = int(float(thisImgHeight)/condenseCoe);  # 计算压缩后像素个数
            thisImgWidth = int(float(thisImgWidth)/condenseCoe);
            
            print("压缩图像分辨率：%d，%d" % (thisImgWidth,thisImgHeight))
            
            '''像素抽样'''
            condenseImg = thisImg.resize((thisImgWidth,thisImgHeight)
                                          #,Image.ANTIALIAS   # 滤波方法
                                          )
            
            '''存储压缩后的图像'''
            thisImg.close()
            condenseImg.save(saveDir)
            condenseImg.close()
            
            